﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Data;
using System.Windows.Forms;

namespace PHI2
{
    class ConsultasBD
    {
        PHIEntities2 entity;

        /// <summary>
        /// Clase que permite ejecutar consultas de selección, y edición sobre la base de datos
        /// </summary>
        /// <param name="entity"></param>
        public ConsultasBD(PHIEntities2 entity)
        {
            this.entity = entity;
        }

        /// <summary>
        /// Consulta la base de datos para obtener la mediciones que correspondan al filtro ingresado por el usuario. No requiere que el usuario ingrese selecciones en todos los filtros.
        /// </summary>
        /// <param name="variedad">Seleccion de variedad ingresada por el usuario</param>
        /// <param name="ensayo">Selección del tipo de ensayo ingresado por el usuario</param>
        /// <param name="repeticion">Selección de la repetición de ensayo ingresado por el usuario</param>
        /// <returns>Lista con las mediciones que correspnden a los filtros</returns>
        public List<Mediciones> ExecuteQueryData(string variedad,string ensayo,string repeticion)
        {
            List<Mediciones> resultado = new List<Mediciones>();

            int v=0;
            int e=0;
            int r=0;

            if (!String.IsNullOrEmpty(variedad))
            {
                v = Int32.Parse(variedad);
            }
            if (!String.IsNullOrEmpty(repeticion))
            {
                r = Int32.Parse(repeticion);
            }
            if (!String.IsNullOrEmpty(ensayo))
            {
                e = Int32.Parse(ensayo);
            }

            try
            {

                if (String.IsNullOrEmpty(variedad) && String.IsNullOrEmpty(ensayo) && String.IsNullOrEmpty(repeticion))
                {

                    var query = from i in entity.Mediciones
                                select i;


                    resultado = query.ToList();

                }

                else if (!String.IsNullOrEmpty(variedad) && String.IsNullOrEmpty(ensayo) && String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                where (i.IdVariedad == v)
                                select i;

                    resultado = query.ToList();
                }

                else if (String.IsNullOrEmpty(variedad) && !String.IsNullOrEmpty(ensayo) && String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                where (i.IdEnsayo == e)
                                select i;

                    resultado = query.ToList();
                }

                else if (String.IsNullOrEmpty(variedad) && String.IsNullOrEmpty(ensayo) && !String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                where (i.Repeticion == r)
                                select i;

                    resultado = query.ToList();
                }
                else if (!String.IsNullOrEmpty(variedad) && !String.IsNullOrEmpty(ensayo) && String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                where ((i.IdVariedad == v) && (i.IdEnsayo == e))
                                select i;

                    resultado = query.ToList();
                }
                else if (!String.IsNullOrEmpty(variedad) && String.IsNullOrEmpty(ensayo) && !String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                where ((i.IdVariedad == v) && (i.Repeticion == r))
                                select i;
                    resultado = query.ToList();
                }
                else if (String.IsNullOrEmpty(variedad) && !String.IsNullOrEmpty(ensayo) && !String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                where ((i.IdEnsayo == e) && (i.Repeticion == r))
                                select i;
                    resultado = query.ToList();
                }
                else
                {
                    var query = from i in entity.Mediciones
                                where ((i.IdVariedad == v) && (i.IdEnsayo == e) && (i.Repeticion == r))
                                select i;
                    resultado = query.ToList();
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");
            }

            return resultado;

         
        }

        /// <summary>
        /// Consulta la base de datos para obtener la mediciones que correspondan al filtro ingresado por el usuario. No requiere que el usuario ingrese selecciones en todos los filtros.
        /// </summary>
        /// <param name="variedad">Seleccion de variedad ingresada por el usuario</param>
        /// <param name="ensayo">Selección del tipo de ensayo ingresado por el usuario</param>
        /// <param name="repeticion">Selección de la repetición de ensayo ingresado por el usuario</param>
        /// <returns>Lista con las mediciones que correspnden a los filtros</returns>
        public List<Object> ExecuteQueryDataJoins(string variedad, string ensayo, string repeticion)
        {
            List<Object> resultado = new List<Object>();

            int v = 0;
            int e = 0;
            int r = 0;

            if (!String.IsNullOrEmpty(variedad))
            {
                v = Int32.Parse(variedad);
            }
            if (!String.IsNullOrEmpty(repeticion))
            {
                r = Int32.Parse(repeticion);
            }
            if (!String.IsNullOrEmpty(ensayo))
            {
                e = Int32.Parse(ensayo);
            }

            try
            {
                if (String.IsNullOrEmpty(variedad) && String.IsNullOrEmpty(ensayo) && String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                join va in entity.Variedades on i.IdVariedad equals va.IdVariedad
                                join en in entity.Ensayo on i.IdEnsayo equals en.IdEnsayo
                                select new { va.CodigoLaboratorio, i.Repeticion, en.Ensayo1,i.FechaSiembra,i.FechaEmergencia,i.FechaEspigadura,i.FechaFloracion,i.FechaMadurez,i.FS,i.DS,i.Bolsa, i.FB, i.TG, i.WG, i.DG, i.HA, i.GLAUCO, i.AP, i.AT, i.LE, i.PM, i.VI, i.AH1, i.LH1, i.AH2, i.LH2, i.AH3, i.LH3, i.MJE, i.COBERTURA };


                    resultado = query.ToList<Object>();
                }

                else if (!String.IsNullOrEmpty(variedad) && String.IsNullOrEmpty(ensayo) && String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                join va in entity.Variedades on i.IdVariedad equals va.IdVariedad
                                join en in entity.Ensayo on i.IdEnsayo equals en.IdEnsayo
                                where (i.IdVariedad == v)
                                select new { va.CodigoLaboratorio, i.Repeticion, en.Ensayo1, i.FechaSiembra, i.FechaEmergencia, i.FechaEspigadura, i.FechaFloracion, i.FechaMadurez, i.FS, i.DS, i.Bolsa, i.FB, i.TG, i.WG, i.DG, i.HA, i.GLAUCO, i.AP, i.AT, i.LE, i.PM, i.VI, i.AH1, i.LH1, i.AH2, i.LH2, i.AH3, i.LH3, i.MJE, i.COBERTURA };


                    resultado = query.ToList<Object>();
                }

                else if (String.IsNullOrEmpty(variedad) && !String.IsNullOrEmpty(ensayo) && String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                join va in entity.Variedades on i.IdVariedad equals va.IdVariedad
                                join en in entity.Ensayo on i.IdEnsayo equals en.IdEnsayo
                                where (i.IdEnsayo == e)
                                select new { va.CodigoLaboratorio, i.Repeticion, en.Ensayo1, i.FechaSiembra, i.FechaEmergencia, i.FechaEspigadura, i.FechaFloracion, i.FechaMadurez, i.FS, i.DS, i.Bolsa, i.FB, i.TG, i.WG, i.DG, i.HA, i.GLAUCO, i.AP, i.AT, i.LE, i.PM, i.VI, i.AH1, i.LH1, i.AH2, i.LH2, i.AH3, i.LH3, i.MJE, i.COBERTURA };


                    resultado = query.ToList<Object>();
                }

                else if (String.IsNullOrEmpty(variedad) && String.IsNullOrEmpty(ensayo) && !String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                join va in entity.Variedades on i.IdVariedad equals va.IdVariedad
                                join en in entity.Ensayo on i.IdEnsayo equals en.IdEnsayo
                                where (i.Repeticion == r)
                                select new { va.CodigoLaboratorio, i.Repeticion, en.Ensayo1, i.FechaSiembra, i.FechaEmergencia, i.FechaEspigadura, i.FechaFloracion, i.FechaMadurez, i.FS, i.DS, i.Bolsa, i.FB, i.TG, i.WG, i.DG, i.HA, i.GLAUCO, i.AP, i.AT, i.LE, i.PM, i.VI, i.AH1, i.LH1, i.AH2, i.LH2, i.AH3, i.LH3, i.MJE, i.COBERTURA };


                    resultado = query.ToList<Object>();
                }
                else if (!String.IsNullOrEmpty(variedad) && !String.IsNullOrEmpty(ensayo) && String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                join va in entity.Variedades on i.IdVariedad equals va.IdVariedad
                                join en in entity.Ensayo on i.IdEnsayo equals en.IdEnsayo
                                where ((i.IdVariedad == v) && (i.IdEnsayo == e))
                                select new { va.CodigoLaboratorio, i.Repeticion, en.Ensayo1, i.FechaSiembra, i.FechaEmergencia, i.FechaEspigadura, i.FechaFloracion, i.FechaMadurez, i.FS, i.DS, i.Bolsa, i.FB, i.TG, i.WG, i.DG, i.HA, i.GLAUCO, i.AP, i.AT, i.LE, i.PM, i.VI, i.AH1, i.LH1, i.AH2, i.LH2, i.AH3, i.LH3, i.MJE, i.COBERTURA };


                    resultado = query.ToList<Object>();
                }
                else if (!String.IsNullOrEmpty(variedad) && String.IsNullOrEmpty(ensayo) && !String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                join va in entity.Variedades on i.IdVariedad equals va.IdVariedad
                                join en in entity.Ensayo on i.IdEnsayo equals en.IdEnsayo
                                where ((i.IdVariedad == v) && (i.Repeticion == r))
                                select new { va.CodigoLaboratorio, i.Repeticion, en.Ensayo1, i.FechaSiembra, i.FechaEmergencia, i.FechaEspigadura, i.FechaFloracion, i.FechaMadurez, i.FS, i.DS, i.Bolsa, i.FB, i.TG, i.WG, i.DG, i.HA, i.GLAUCO, i.AP, i.AT, i.LE, i.PM, i.VI, i.AH1, i.LH1, i.AH2, i.LH2, i.AH3, i.LH3, i.MJE, i.COBERTURA };

                    resultado = query.ToList<Object>();
                }
                else if (String.IsNullOrEmpty(variedad) && !String.IsNullOrEmpty(ensayo) && !String.IsNullOrEmpty(repeticion))
                {
                    var query = from i in entity.Mediciones
                                join va in entity.Variedades on i.IdVariedad equals va.IdVariedad
                                join en in entity.Ensayo on i.IdEnsayo equals en.IdEnsayo
                                where ((i.IdEnsayo == e) && (i.Repeticion == r))
                                select new { va.CodigoLaboratorio, i.Repeticion, en.Ensayo1, i.FechaSiembra, i.FechaEmergencia, i.FechaEspigadura, i.FechaFloracion, i.FechaMadurez, i.FS, i.DS, i.Bolsa, i.FB, i.TG, i.WG, i.DG, i.HA, i.GLAUCO, i.AP, i.AT, i.LE, i.PM, i.VI, i.AH1, i.LH1, i.AH2, i.LH2, i.AH3, i.LH3, i.MJE, i.COBERTURA };

                    resultado = query.ToList<Object>();
                }
                else
                {
                    var query = from i in entity.Mediciones
                                join va in entity.Variedades on i.IdVariedad equals va.IdVariedad
                                join en in entity.Ensayo on i.IdEnsayo equals en.IdEnsayo
                                where ((i.IdVariedad == v) && (i.IdEnsayo == e) && (i.Repeticion == r))
                                select new { va.CodigoLaboratorio, i.Repeticion, en.Ensayo1, i.FechaSiembra, i.FechaEmergencia, i.FechaEspigadura, i.FechaFloracion, i.FechaMadurez, i.FS, i.DS, i.Bolsa, i.FB, i.TG, i.WG, i.DG, i.HA, i.GLAUCO, i.AP, i.AT, i.LE, i.PM, i.VI, i.AH1, i.LH1, i.AH2, i.LH2, i.AH3, i.LH3, i.MJE, i.COBERTURA };

                    resultado = query.ToList<Object>();
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");
            }
            return resultado;


        }
        
        /// <summary>
        /// Método que permite realizar consultas de parcelas
        /// </summary>
        /// <param name="variedad"></param>
        /// <param name="repeticion"></param>
        /// <returns></returns>
        public List<Parcelas> ExecuteQueryLand(string variedad, string repeticion)
        {
            int v=0;
            int r = 0;
            List<Parcelas> resultado = new List<Parcelas>();
            v=Int32.Parse(variedad);

            try
            {
                if (!String.IsNullOrEmpty(repeticion))
                {
                    r = Int32.Parse(repeticion);

                    var query = from i in entity.Parcelas
                                where ((i.IdVariedad == v) && (i.Repeticion == r))
                                select i;
                    resultado = query.ToList();
                }

                else
                {
                    var query = from i in entity.Parcelas
                                where (i.IdVariedad == v)
                                select i;
                    resultado = query.ToList();
                }
            }
            catch(Exception exc)
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");
            }

            return resultado;
        }

        /// <summary>
        /// Método que permite agregar mediciones
        /// </summary>
        /// <param name="idvariedad"></param>
        /// <param name="repeticion"></param>
        /// <param name="idensayo"></param>
        /// <param name="fb"></param>
        /// <param name="tg"></param>
        /// <param name="wg"></param>
        /// <param name="dg"></param>
        /// <param name="ha"></param>
        /// <param name="glauco"></param>
        /// <param name="ap"></param>
        /// <param name="at"></param>
        /// <param name="le"></param>
        /// <param name="pm"></param>
        /// <param name="vl"></param>
        /// <param name="ah1"></param>
        /// <param name="lh1"></param>
        /// <param name="ah2"></param>
        /// <param name="lh2"></param>
        /// <param name="ah3"></param>
        /// <param name="lh3"></param>
        /// <param name="mje"></param>
        /// <param name="cobertura"></param>
        public void AddMedicion(int idvariedad, int repeticion, int idensayo,DateTime fechaSiembra, DateTime fechaEmergencia,DateTime fechaEspigadura,DateTime fechaFloracion,DateTime fechaMadurez,
        float fs,float ds,float bolsa,
        float fb, float tg, float wg, float dg, float ha, float glauco, float ap, float at, float le, float pm, float vl, float ah1,
        float lh1, float ah2, float lh2, float ah3, float lh3, float mje, float cobertura)
        {
            try
            {
                Mediciones pro = new Mediciones
                {
                    IdVariedad = idvariedad,
                    Repeticion = repeticion,
                    IdEnsayo = idensayo,
                    FechaSiembra=fechaSiembra,
                    FechaEmergencia=fechaEmergencia,
                    FechaEspigadura=fechaEspigadura,
                    FechaFloracion=fechaFloracion,
                    FechaMadurez=fechaMadurez,
                    FS=fs,
                    DS=ds,
                    Bolsa=bolsa,
                    FB = fb,
                    TG = tg,
                    WG = wg,
                    DG = dg,
                    HA = ha,
                    GLAUCO = glauco,
                    AP = ap,
                    AT = at,
                    LE = le,
                    PM = pm,
                    VI = vl,
                    AH1 = ah1,
                    LH1 = lh1,
                    AH2 = ah2,
                    LH2 = lh2,
                    AH3 = ah3,
                    LH3 = lh3,
                    MJE = mje,
                    COBERTURA = cobertura,
                };

                entity.Mediciones.Add(pro);
                entity.SaveChanges();
            }

            catch (Exception ex)
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");
            }
        }


        /// <summary>
        /// Método que permite actualizar mediciones
        /// </summary>
        /// <param name="idvariedad"></param>
        /// <param name="repeticion"></param>
        /// <param name="idensayo"></param>
        /// <param name="fb"></param>
        /// <param name="tg"></param>
        /// <param name="wg"></param>
        /// <param name="dg"></param>
        /// <param name="ha"></param>
        /// <param name="glauco"></param>
        /// <param name="ap"></param>
        /// <param name="at"></param>
        /// <param name="le"></param>
        /// <param name="pm"></param>
        /// <param name="vl"></param>
        /// <param name="ah1"></param>
        /// <param name="lh1"></param>
        /// <param name="ah2"></param>
        /// <param name="lh2"></param>
        /// <param name="ah3"></param>
        /// <param name="lh3"></param>
        /// <param name="mje"></param>
        /// <param name="cobertura"></param>
        public void UpdateMedicion(int idvariedad, int repeticion, int idensayo, DateTime fechaSiembra, DateTime fechaEmergencia, DateTime fechaEspigadura, DateTime fechaFloracion, DateTime fechaMadurez,
        float fs, float ds, float bolsa,
        float fb, float tg, float wg, float dg, float ha, float glauco, float ap, float at, float le, float pm, float vl, float ah1,
        float lh1, float ah2, float lh2, float ah3, float lh3, float mje, float cobertura)
        {
            try
            {
                var query=(from i in entity.Mediciones
                          where((i.IdVariedad==idvariedad)&& (i.IdEnsayo==idensayo) && (i.Repeticion==repeticion))
                          select i).FirstOrDefault();
                query.FechaSiembra=fechaSiembra;
                query.FechaEmergencia=fechaEmergencia;
                query.FechaEspigadura=fechaEspigadura;
                query.FechaFloracion=fechaFloracion;
                query.FechaMadurez=fechaMadurez;
                query.FS=fs;
                query.DS=ds;
                query.Bolsa = bolsa;
                query.FB = fb;
                query.TG = tg;
                query.WG = wg;
                query.DG = dg;
                query.HA = ha;
                query.GLAUCO = glauco;
                query.AP = ap;
                query.AT = at;
                query.LE = le;
                query.PM = pm;
                query.VI = vl;
                query.AH1 = ah1;
                query.LH1 = lh1;
                query.AH2 = ah2;
                query.LH2 = lh2;
                query.AH3 = ah3;
                query.LH3 = lh3;
                query.MJE = mje;
                query.COBERTURA = cobertura;

                entity.SaveChanges();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");

            }
        }

        //Método que agrega fila a la Tabla Variedades
        public void AddVariedad(int codigoVariedad, string nombrevariedad, string descripcion)
        {
            try
            {
                Variedades pro = new Variedades
                {
                    CodigoLaboratorio = codigoVariedad,
                    NombreVariedad = nombrevariedad,
                    Descripcion = descripcion,
                    Titulo=codigoVariedad+". "+nombrevariedad
                };

                entity.Variedades.Add(pro);
                entity.SaveChanges();
            }

            catch (Exception ex)
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");
            }
        }

        /// <summary>
        /// Método que permite agregar parcelas
        /// </summary>
        /// <param name="codigoLaboratorio"></param>
        /// <param name="repeticion"></param>
        /// <param name="parcela"></param>
        public void AddParcela(int codigoLaboratorio, int repeticion, int parcela)
        {
            int variedad = ObtenerIdVariedad(codigoLaboratorio);
            try
            {
                Parcelas pro = new Parcelas
                {
                    IdVariedad = variedad,
                    Repeticion = repeticion,
                    Parcela = parcela,
                };

                entity.Parcelas.Add(pro);
                entity.SaveChanges();
            }

            catch (Exception ex)
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");
            }
        }

        /// <summary>
        /// Método que permite obtener el id de una variedad a partir de su código de laboratorio
        /// </summary>
        /// <param name="codigoLaboratorio"></param>
        /// <returns></returns>
        public int ObtenerIdVariedad(int codigoLaboratorio)
        {
            int variedad = -1;
            try
            {
            var idVariedad = (from i in entity.Variedades
                              where i.CodigoLaboratorio == codigoLaboratorio
                              select i.IdVariedad).First();
           
                variedad = Int32.Parse(idVariedad.ToString());
            }
            catch
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");
            }

            return variedad;

        }

        /// <summary>
        /// Método que afirma o niega si es posible actualizar una fila de mediciones
        /// </summary>
        /// <param name="idVariedad"></param>
        /// <param name="idEnsayo"></param>
        /// <param name="repeticion"></param>
        /// <returns></returns>
        public bool EsUpdate(int idVariedad,int idEnsayo, int repeticion)
        {
            List<Mediciones> mediciones = ExecuteQueryData(idVariedad.ToString(), idEnsayo.ToString(), repeticion.ToString());
            if (mediciones.Count > 0)
            {
                return true;
            }
            return false;
        }
        
        /// <summary>
        /// Método que permite eliminar una fila de mediciones
        /// </summary>
        /// <param name="es"></param>
        /// <param name="idvariedad"></param>
        /// <param name="repeticion"></param>
        /// <param name="idensayo"></param>
        public void DeleteMedicion(PHIEntities2 es, string idvariedad, string repeticion, string idensayo)
        {
            try
            {
                int a = Int32.Parse(idvariedad);
                int b = Int32.Parse(repeticion);
                int c = Int32.Parse(idensayo);
                Mediciones pro = es.Mediciones.First(i => ((i.IdVariedad == a) && (i.Repeticion == b) && (i.IdEnsayo == c)));
                es.Mediciones.Remove(pro);
                es.SaveChanges();
                MessageBox.Show("La medición a sido eliminada");
            }

            catch (Exception ex)
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");
            }
        }

        /// <summary>
        /// Método que elimina fila a la Tabla Variedades segun coincidencia con IdVariedad
        /// </summary>
        /// <param name="es"></param>
        /// <param name="idvariedad"></param>
        public void DeleteVariedad(int codigovariedad)
        {
            try
            {
                Variedades pro = entity.Variedades.First(i => ((i.IdVariedad == codigovariedad)));
                entity.Variedades.Remove(pro);
                entity.SaveChanges();
                MessageBox.Show("Se ha eliminado una variedad de la base de datos");
            }

            catch (Exception ex)
            {
                MessageBox.Show("Existen problemas en la conexión a la base de datos. Favor revise e intente nuevamente.");
            }
        }

        }   
    }


